// 定义一个函数判断两个有符号整数相加是否会溢出
#include <stdio.h>
#include <limits.h> 

// 规则：
// 如果 x 和 y 都是正数，且它们的和小于 0，则发生了正溢出。
// 如果 x 和 y 都是负数，且它们的和大于 0，则发生了负溢出。
// 如果 x 和 y 的符号不同，则不会发生溢出。
// 换言之： 在补码运算中，当两个正数相加结果为负数，或者两个负数相加结果为正数时，就发生了溢出。
int tadd_ok(int x, int y) {
    int sum = x + y;
    // 检查是否发生了溢出
    return ((x > 0 && y > 0 && sum < 0) || (x < 0 && y < 0 && sum > 0)) ? 0 : 1;
}
// 测试函数
int main() {
    int x = INT_MAX; // 最大的有符号整数
    int y = 1; // 加1
    if (tadd_ok(x, y)) {
        printf("No overflow\n");
    } else {
        printf("Overflow\n");
    }
    return 0;
}

// Usage: gcc -o tadd_ok.out 2.30-tadd_ok.c
// Output: Overflow